// 开闭原则 对扩展开放 对修改关闭 扩展已有的代码来实现新功能而不是修改现有代码来实现新功能

// 不符合开闭原则 每添加一个图形就需要修改 AreaCalculator 类来实现面积计算
// class Rectangle {
//   constructor(public width: number, public height: number) { // 接收矩形宽和高
//   }
// }
// class Circle {
//   constructor(public radius: number) { // 接收圆形半径
//   }
// }
// class AreaCalculator {
//   calculateArea(shape) {
//     if (shape instanceof Rectangle) { // 矩形 计算面积
//       return shape.width * shape.height
//     } else if (shape instanceof Circle) { // 圆形 计算面积
//       return Math.PI * shape.radius * shape.radius
//     }
//   }
// }

// 符合开闭原则 添加新的图形只需要实现 Shape 接口即可
interface Shape {
  calculateArea(): number
}
class Rectangle implements Shape { // 矩形需要实现 Shape 接口
  constructor(public width: number, public height: number) {
  }
  calculateArea(): number {
    return this.width * this.height;
  }
}
class Circle implements Shape {
  constructor(public radius: number){}
  calculateArea(): number {
    return Math.PI * this.radius * this.radius
  }
}
class AreaCalculator{
  static calculateArea(shape: Shape) { // 计算图形面积
    return shape.calculateArea()
  }
}
let result1 = AreaCalculator.calculateArea(new Rectangle(10, 20))
console.log(result1) // 200
let result2 = AreaCalculator.calculateArea(new Circle(100))
console.log(result2) // 31415.926535897932

export {} // 将当前文件变成一个模块